/*global pi, self, Image */
/**
 * 预加载图像模块，提供图片头数据加载就绪事件，可更快获取图片尺寸
 * @param   {String}	图片路径
 * @param   {Function}  回调函数，如果参数有error表示错误，参数有sizeReady表示图片尺寸已获取到，没有表示图片加载完成
 * @param   {Bool}  是否需要图片尺寸就绪的回调
 * @example pi.ui.imgload.load('http://www.google.com.hk/intl/zh-CN/images/logo_cn.png', function (img) {
		alert('size ready: width=' + img.width + '; height=' + img.height);
	});
 */
pi.mod.define('pi.ui.imgload', function(pi) {
	"use strict";
	// 定义模块
	var module = {},
	list = [],
	TIMEOUT = 40,
	// 定时执行函数
	timeout = function() {
		var img, i, n = list.length;
		for (i = n - 1; i >= 0; i--) {
			img = list[i];
			if (img.sizeReady) {
				if (img.width && img.height) {
					img.sizeReady(img);
					delete img.sizeReady;
					list[i] = list[--n];
				}
			} else {
				list[i] = list[--n];
			}
		}
		if (n < list.length) {
			list.length = n;
		}
		timeout.timeRef = (n > 0) ? self.setTimeout(timeout, TIMEOUT) : undefined;
	},
	//加载图像
	load = function(url, callback, sizeReady) {
		var img = new Image();
		img.src = url;
		// 如果图片被缓存，则直接返回缓存数据
		if (img.complete) {
			callback(img);
			return;
		}
		img.sizeReady = callback;
		// 加载错误后的事件
		img.onerror = function() {
			var fun = img.sizeReady;
			delete img.sizeReady;
			img = img.onload = img.onerror = null;
			if (fun) {
				fun({
					error: "img error",
					reason: "",
					src: url
				});
			}
		};
		// 完全加载完毕的事件
		img.onload = function() {
			// onload在定时器时间差范围内可能比onready快
			var fun = img.sizeReady;
			delete img.sizeReady;
			// IE gif动画会循环执行onload，置空onload即可
			img = img.onload = img.onerror = null;
			if (fun) {
				fun(img);
			}
		};
		// 加入队列中定期执行
		if (sizeReady) {
			list.push(img);
			if (list.length === 1) {
				timeout.timeRef = self.setTimeout(timeout, TIMEOUT);
			}
		}
	};
	module.load = load;
	//批量加载图像，返回已就绪图像的数量
	module.loads = function(urls, callback, sizeReady) {
		var i, pre, count = 0,
		fun = function(img) {
			count++;
			if (pre) {
				callback(img);
			}
		};
		for (i = urls.length - 1; i >= 0; i--) {
			load(urls[i], fun, sizeReady);
		}
		pre = true;
		return count;
	};
	// 停止所有图片的加载回调
	module.stop = function() {
		if (timeout.timeRef) {
			var i;
			self.clearTimeout(timeout.timeRef);
			for (i = list.length - 1; i >= 0; i--) {
				delete list[i].sizeReady;
			}
			list = [];
		}
	};
	return module;
});